Auf Abwegen [AutoIt]

Zur Abwechslung dieses Mal nichts aus der Rubrik ABAP. Das Thema ist AutoIT. AutoIt ist ein Freeware BASIC-Dialekt, von dem Stefan mir bereits einige Male erzählt hat. Er hat sogar SAP und AutoIt verbunden: SCN-Artikel.

Der Grund, weswegen ich AutoIt brauchte, ist der folgende: Von einer internen Internetseite wollte ich Daten (Artikel + Dokumente) automatisiert übernehmen. ABAP kommt da erst mal nicht in Frage… Also erinnerte ich mich an AutoIt. BASIC-Programmierung ist nicht schwer (dachte ich) und die Funktionen sind sehr gut und mit Beispielen dokumentiert (wusste ich von Stefan).

Also ran ans Werk.

Voraussetzungen

Die von uns verwendete Community von der ich die Daten sammeln wollte, bietet eine einfache Möglichkeit, einen Artikel als PDF abzuspeichern: An die URL muss lediglich die Endung “.pdf” gehängt werde und der Artikel wird in eine PDF-Datei umgewandelt und direkt angezeigt.

Leider werden als URLs nur Nummern verwendet, wie z.B. “DOC-1234”. Ich wollte die Datei natürlich nicht nur als DOC-1234.pdf speichern, sondern den Titel des Dokumentes als Dateiname verwenden.

Automatisieren wollte ich die Ermittlung aller vorhandenen Dokumente und das Speichern der Datei unter einem sprechenden Namen.

Quelle: RSS

Durch Zufall bin ich darauf gestoßen, dass die Seite einen RSS-Feed mit den relevanten Informationen zur Verfügung stellt: URL + Titel.

Die Idee war also, den RSS-Stream von allen Dokumenten zu speichern und dann in diesem mit Hilfe von AutoIt nach den entsprechenden Tags zu durchsuchen.

Erste Berührung mit AutoIt

Ich war darauf gefasst, dass ich bestimmte Aktionen mittels Rekorder aufzeichnen müsste um diese dann wieder abzuspeichern:

  • Aufruf URL
  • Markieren des Titels
  • STRG-C um den Titel in den Zwischenspeicher zu kopieren
  • Bewegen der Maus an den Bildschirmrand, damit das Speichern-Symbol erscheint
  • Klick auf “Speichern”
  • STRG-V um den Titel als Dateiname wieder einzufügen

Nach ein paar Stunden Recherche und Ausprobieren war alles viel einfacher und es entstand ein kurzes AutoIt-Skript.

Kurz zur Funktionsweise:

Mit der Funktion FileOpen wird der abgespeicherte RSS-Feed eingelesen.

Mittels _StringBetween konnte ich die URLs in ein einfaches Array laden. Für den Titel benutzte ich ein zweites Array.

Die vorhandene Funktion inetget war wie für mich gemacht: Sie speichert eine übergebene URL als Datei.

Ein Loop drum herum (FOR-NEXT, wir sind ja in BASIC!) und fertig war das Klau-äähhh-Migrations-Skript.

Direkter ist perfekter

Den Umweg über die Datei hätte ich mir sparen können, denn der folgende Code liest den RSS-Stream direkt in eine Variable:

Local $dRSS = inetread("http://www.website.de/feed/")
Local $sRSS = BinaryToString($dRSS)

Arrays

Die Arbeit mit Arrays ist anders, als mit “internen Tabellen”. AutoIt bietet eine Menge Funktionen an, um Arrays zu füllen und zu bearbeiten.

Eine Datei kann zum Beispiel sehr einfach in ein Array geladen werden:

#include <File.au3>
Dim $arCSV
$csvFile = “muster.csv”
_FileReadToArray($csvFile, $arCSV)

Das eingelesene Array kann zu Kontrollzwecken mit _ArrayDisplay einfach angezeigt werden:

2016-01-31_00-05-21

Erfahrungen

Natürlich bin ich erst über ein paar Umwege und mit tatkräftiger Unterstützung von Stefan dahin gekommen, aber ich muss sagen, dass mir AutoIt ausnehmend gut gefallen hat! Einfaches Dateihandling, viele Stringfunktionen, eine sehr gute Dokumentation mit Beispielen machten es mir wirklich einfach, mein Problem zu lösen.

Nachdem ich mich daran gewöhnt habe, dass es bei BASIC IF-THEN heißt, und nicht nur einfach IF, ging die Arbeit mit AutoIt leicht von der Hand.

Ich habe mich nur auf die Aufgabe konzentriert und wenig links und rechts geguckt. Was ich allerdings beim Recherchieren und Ausprobieren der Beispielprogramme gesehen habe: Es scheint schier unendliche Möglichkeiten zu geben, das Windows-System zu steuern. Einzelne Fenster von laufenden Applikationen können gesucht und “übernommen” werden. Auf viele Funktionen kann direkt zugegriffen werden.

Probleme gab es mit der _IE-Bibliothek zur Steuerung des Internet Explorers auf meinem Rechner. Ich musste erst den “sicheren Modus” abschalten, damit die Bibliothek ihren Dienst tun konnte. Letztendlich habe ich sie nicht benötigt, denn inetget ist die Perfekte Lösung, aber mit den _IE-Funktionen hätte ich dem Internet Explorer “Beine machen können”.

Editor

Der Editor ist einfach zu bedienen und bietet Syntax Highlighting, Autovervollständigung, eine Tidy-Code-Funktion und vieles Mehr.

2016-01-30_23-47-14

Insgesamt hat mit AutoIt sehr beeindruckt und ich werde es in Zukunft sicherlich öfter als Problemlösungswaffe in Betracht ziehen.

AutoIt-Skript

Folgend das erarbeitete Skript, das aus einem gespeicherten RSS-Feed die URLs aufruft und als Datei speichert.

#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
#include <String.au3>
#include <Array.au3>
#include <InetConstants.au3>
Example()
Func Example()
 Local Const $sFilepath = "D:\temp\feed.xml"
 Local $hFileOpen = FileOpen($sFilepath, $FO_READ)
 If $hFileOpen = -1 Then
 MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file.")
 Return False
 EndIf
; Read the contents of the file using the handle returned by FileOpen.
 Local $sFileRead = FileRead($hFileOpen)
; Close the handle returned by FileOpen.
 FileClose($hFileOpen)
 Local $aArray = _StringBetween($sFileRead, "<link>", "</link>", $STR_ENDISSTART)
 Local $aArray_descr = _StringBetween($sFileRead, "<title>", "</title>", $STR_ENDISSTART)
 For $index = 0 To _ArrayMaxIndex($aArray)
  $url = $aArray[$index]
  If StringLeft($url, 5) = "https" Then
   inetget($url & ".pdf", "D:\temp\jive\" & $aArray_descr[$index] & ".pdf")
   Sleep(1000)
  EndIf
 Next
EndFunc ;==>Example
Enno Wulff